package com.reglas.gladiadores;

import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import JavaCode.Ciudad;
import JavaCode.Gladiador;
import JavaCode.Ludus;

/************************************************
 * Conjunto de Reglas para mejorar el Ludus, Numero de etiquetas(2): tiene,
 * noTiene Variables de entrada(6): Dinero, nivelEntrenador
 * nivelnivelAgilidadEscuela, nivelnivelDestrezaEscuela,
 * nivelnivelResistenciaEscuela, nivelnivelFuerzaEscuela, Prioridad
 * Entrenador>Instalaciones Mejora de Instalaciones: 2 a 2 1. Si
 * caracteristica1Gladiadores>nivelCaracteristica1 2.
 * caracteristica2Gladiadores<caracteristica1Gladiadores 3.
 * nivelCaracteristica2<nivelCaracteristica1
 *************************************************/

public class ReglasLudus {
	// Atributos de la IA
	private ArrayList<Acciones> listaAcciones;
	private List<Ludus> listaLudusCPU;
	private int dinero;
	private int nivelFuerzaEscuela;
	private int nivelResistenciaEscuela;
	private int nivelDestrezaEscuela;
	private int nivelAgilidadEscuela;
	private int entrenador;
	private boolean tieneDinero;
	private boolean tieneEntrenador;
	private double fuerzaMediaGladiador;
	private double resistenciaMediaGladiador;
	private double agilidadMediaGladiador;
	private double destrezaMediaGladiador;
	private int relacionFuerza;
	private int relacionAgilidad;
	private int relacionDestreza;
	private int relacionResistencia;

	public ReglasLudus(int numeroLudus) {

		listaAcciones = new ArrayList<Acciones>();

		Ludus ludus = Ciudad.getMiInstanciaCiudad().getListaLudus()
				.get(numeroLudus);
		dinero = dineroEscuela(ludus);
		nivelFuerzaEscuela = nivelnivelFuerzaEscuela(ludus);
		nivelResistenciaEscuela = nivelnivelResistenciaEscuela(ludus);
		nivelDestrezaEscuela = nivelnivelDestrezaEscuela(ludus);
		nivelAgilidadEscuela = nivelnivelAgilidadEscuela(ludus);
		entrenador = nivelEntrenador(ludus);
		tieneEntrenador = devuelveNivelEntrenador();

		fuerzaMediaGladiador = calculofuerzaMediaGladiadores(ludus);
		resistenciaMediaGladiador = calculoResistenciaMediaGladiadores(ludus);
		agilidadMediaGladiador = calculoAgilidadMediaGladiadores(ludus);
		destrezaMediaGladiador = calculoDestrezaMediaGladiadores(ludus);

		tieneDinero = devuelveDinero();
		relacionAgilidad = relacionAgilidadInstalacionGladiador();
		relacionDestreza = relacionDestrezaInstalacionesGladiadores();
		relacionFuerza = relacionFuerzaInstalacionGladiador();
		relacionResistencia = relacionResistenciaInstalacionesGladiadores();

	}

	public ArrayList<Acciones> ejecucionReglas() {

		if (!tieneDinero) {
			listaAcciones.add(new Acciones("No mejorar escuela", 0));
		}

		// Si el nivel del entrenador es bajo -> Mejorar Entrenador
		if (tieneDinero && !tieneEntrenador) {
			listaAcciones.add(new Acciones("Entrenador-Prioridad Alta", 10));
		}

		/********************************* Mejora Instalaciones Fuerza ****************************************************/
		if (tieneDinero && tieneEntrenador && relacionFuerza < relacionAgilidad
				&& relacionFuerza <= relacionDestreza
				&& relacionFuerza <= relacionResistencia) {
			if (!listaAcciones
					.contains(new Acciones("Fuerza-Prioridad Alta", 8)))
				listaAcciones.add(new Acciones("Fuerza-Prioridad Alta", 8));
		}

		else if (tieneDinero
				&& tieneEntrenador
				&& (relacionFuerza <= relacionAgilidad && relacionFuerza <= relacionDestreza)
				|| (relacionFuerza <= relacionAgilidad && relacionFuerza <= relacionResistencia)
				|| (relacionFuerza <= relacionDestreza && relacionFuerza <= relacionResistencia)) {
			if (!listaAcciones.contains(new Acciones("Fuerza-Prioridad Media",
					6)))
				listaAcciones.add(new Acciones("Fuerza-Prioridad Media", 6));
		}

		else if (tieneDinero
				&& tieneEntrenador
				&& (relacionFuerza <= relacionAgilidad
						|| relacionFuerza <= relacionDestreza || relacionFuerza <= relacionResistencia)) {
			if (!listaAcciones
					.contains(new Acciones("Fuerza-Prioridad Baja", 2)))
				listaAcciones.add(new Acciones("Fuerza-Prioridad Baja", 2));
		}

		/**********************************************************************************************************************************/
		/********************************* Mejora de Agilidad ****************************************************/
		if (tieneDinero && tieneEntrenador && relacionAgilidad < relacionFuerza
				&& relacionAgilidad <= relacionDestreza
				&& relacionAgilidad <= relacionResistencia) {
			if (!listaAcciones.contains(new Acciones("Agilidad-Prioridad Alta",
					8)))
				listaAcciones.add(new Acciones("Agilidad-Prioridad Alta", 8));
		}

		else if (tieneDinero
				&& tieneEntrenador
				&& (relacionAgilidad <= relacionFuerza && relacionAgilidad <= relacionDestreza)
				|| (relacionAgilidad <= relacionFuerza && relacionAgilidad <= relacionResistencia)
				|| (relacionAgilidad <= relacionDestreza && relacionAgilidad <= relacionResistencia))

		{
			if (!listaAcciones.contains(new Acciones(
					"Agilidad-Prioridad Media", 6)))
				listaAcciones.add(new Acciones("Agilidad-Prioridad Media", 6));
		}

		else if (tieneDinero
				&& tieneEntrenador
				&& (relacionAgilidad <= relacionFuerza
						|| relacionAgilidad <= relacionDestreza || relacionAgilidad <= relacionResistencia)) {
			if (!listaAcciones.contains(new Acciones("Agilidad-Prioridad Baja",
					2)))
				listaAcciones.add(new Acciones("Agilidad-Prioridad Baja", 2));
		}

		/********************************* Mejora de Destreza ****************************************************/
		if (tieneDinero && tieneEntrenador && relacionDestreza < relacionFuerza
				&& relacionDestreza <= relacionAgilidad
				&& relacionDestreza <= relacionResistencia) {
			if (!listaAcciones.contains(new Acciones("Destreza-Prioridad Alta",
					8)))
				listaAcciones.add(new Acciones("Destreza-Prioridad Alta", 8));
		}

		else if (tieneDinero
				&& tieneEntrenador
				&& (relacionDestreza <= relacionFuerza && relacionDestreza <= relacionAgilidad)
				|| (relacionDestreza <= relacionFuerza && relacionDestreza <= relacionResistencia)
				|| (relacionDestreza <= relacionAgilidad && relacionDestreza <= relacionResistencia))

		{
			if (!listaAcciones.contains(new Acciones(
					"Destreza-Prioridad Media", 6)))
				listaAcciones.add(new Acciones("Destreza-Prioridad Media", 6));
		}

		else if (tieneDinero
				&& tieneEntrenador
				&& (relacionDestreza <= relacionFuerza
						|| relacionDestreza <= relacionAgilidad || relacionDestreza <= relacionResistencia)) {
			if (!listaAcciones.contains(new Acciones("Destreza-Prioridad Baja",
					2)))
				listaAcciones.add(new Acciones("Destreza-Prioridad Baja", 2));
		}

		/********************************* Mejora de Resistencia ****************************************************/

		if (tieneDinero && tieneEntrenador
				&& relacionResistencia < relacionFuerza
				&& relacionResistencia <= relacionAgilidad
				&& relacionResistencia <= relacionDestreza) {
			if (!listaAcciones.contains(new Acciones(
					"Resistencia-Prioridad Alta", 8)))
				listaAcciones
						.add(new Acciones("Resistencia-Prioridad Alta", 8));
		}

		else if (tieneDinero
				&& tieneEntrenador
				&& (relacionResistencia <= relacionFuerza && relacionDestreza <= relacionAgilidad)
				|| (relacionResistencia <= relacionFuerza && relacionDestreza <= relacionDestreza)
				|| (relacionResistencia <= relacionAgilidad && relacionDestreza <= relacionDestreza))

		{
			if (!listaAcciones.contains(new Acciones(
					"Resistencia-Prioridad Media", 6)))
				listaAcciones
						.add(new Acciones("Resistencia-Prioridad Media", 6));
		}

		else if (tieneDinero
				&& tieneEntrenador
				&& (relacionResistencia <= relacionFuerza
						|| relacionResistencia <= relacionAgilidad || relacionResistencia <= relacionDestreza)) {
			if (!listaAcciones.contains(new Acciones(
					"Resistencia-Prioridad Baja", 2)))
				listaAcciones
						.add(new Acciones("Resistencia-Prioridad Baja", 2));
		}

		return listaAcciones;
	}

	// ** Metodos auxiliares para la mejora de la escuela rival **

	// Media de las instalaciones
	private double mediaInstalaciones(Ludus ludus) {
		int fuerza = nivelnivelFuerzaEscuela(ludus);
		int dest = nivelnivelDestrezaEscuela(ludus);
		int agi = nivelnivelAgilidadEscuela(ludus);
		int resis = nivelnivelResistenciaEscuela(ludus);
		double mediaInstalaciones = (fuerza + dest + agi + resis) / 4;
		return mediaInstalaciones;
	}

	// Dinero de la escuela
	private int dineroEscuela(Ludus ludus) {
		return ludus.getMoney();
	}

	// Nivel entrenador
	private int nivelEntrenador(Ludus ludus) {
		return ludus.getEntrenador();
	}

	// Fuerza media de los gladiadores
	private int calculofuerzaMediaGladiadores(Ludus ludus) {
		int fuerzaGlad = 0;
		ArrayList<Gladiador> listaGladiadores = ludus.getGladiadores();
		Iterator<Gladiador> it = listaGladiadores.iterator();
		while (it.hasNext()) {
			Gladiador g = it.next();
			fuerzaGlad = fuerzaGlad + g.getStr();
		}
		return fuerzaGlad / listaGladiadores.size();

	}

	// Destreza media de los gladiadores
	private int calculoDestrezaMediaGladiadores(Ludus ludus) {
		int destrezaGlad = 0;
		ArrayList<Gladiador> listaGladiadores = ludus.getGladiadores();
		Iterator<Gladiador> it = listaGladiadores.iterator();
		while (it.hasNext()) {
			Gladiador g = it.next();
			destrezaGlad = destrezaGlad + g.getDex();
		}
		return destrezaGlad / listaGladiadores.size();

	}

	// Agilidad media de los gladiadores
	private int calculoAgilidadMediaGladiadores(Ludus ludus) {
		int agilidadGlad = 0;
		ArrayList<Gladiador> listaGladiadores = ludus.getGladiadores();
		Iterator<Gladiador> it = listaGladiadores.iterator();
		while (it.hasNext()) {
			Gladiador g = it.next();
			agilidadGlad = agilidadGlad + g.getAgi();
		}
		return agilidadGlad / listaGladiadores.size();

	}

	// Resistencia media de los gladiadores
	private int calculoResistenciaMediaGladiadores(Ludus ludus) {
		int resistGlad = 0;
		ArrayList<Gladiador> listaGladiadores = ludus.getGladiadores();
		Iterator<Gladiador> it = listaGladiadores.iterator();
		while (it.hasNext()) {
			Gladiador g = it.next();
			resistGlad = resistGlad + g.getRes();
		}
		return resistGlad / listaGladiadores.size();

	}

	// Fuerza de la escuela
	private int nivelnivelFuerzaEscuela(Ludus ludus) {
		return ludus.getNivelStr();
	}

	// Agilidad media de los gladiadores
	private int nivelnivelAgilidadEscuela(Ludus ludus) {
		return ludus.getNivelAgi();
	}

	// Destreza media de los gladiadores
	private int nivelnivelDestrezaEscuela(Ludus ludus) {
		return ludus.getNivelDex();
	}

	// Resistencia media de los gladiadores
	private int nivelnivelResistenciaEscuela(Ludus ludus) {
		return ludus.getNivelRes();

	}

	private boolean devuelveDinero() {
		return tieneDinero = (dinero > 50);
	}

	private boolean devuelveNivelEntrenador() {
		int mediaInstalaciones = (nivelResistenciaEscuela
				+ nivelAgilidadEscuela + nivelDestrezaEscuela + nivelFuerzaEscuela) / 4;
		return tieneEntrenador = (entrenador > mediaInstalaciones);
	}

	// Relacion Instalaciones con Gladiadores Fuerza
	private int relacionFuerzaInstalacionGladiador() {
		return nivelFuerzaEscuela * 10 + (int) fuerzaMediaGladiador;
	}

	// Relacion Instalaciones con Gladiadores Agilidad
	private int relacionAgilidadInstalacionGladiador() {
		return nivelAgilidadEscuela * 10 + (int) agilidadMediaGladiador;
	}

	// Relacion Instalaciones con Gladiadores Resistencia
	private int relacionResistenciaInstalacionesGladiadores() {
		return nivelResistenciaEscuela * 10 + (int) resistenciaMediaGladiador;
	}

	// Relacion Instalaciones con Gladiadores Destreza
	private int relacionDestrezaInstalacionesGladiadores() {
		return nivelDestrezaEscuela * 10 + (int) destrezaMediaGladiador;
	}

	public ArrayList<Acciones> getListaAcciones() {
		return listaAcciones;
	}

}
